import TimeHelper from "./TimeHelper";
import { TimeUpdateType } from "./TimeDisplay";
export default class TimeObserver {

    // 倒计时时间 单位秒  由于服务器返回的是秒，而时间管理器需要毫秒 所以注意时间转换。
    protected time: number = 0;

    //回调函数
    protected func: Function;

    //time为0时 是否从时间管理器中移除。
    // protected autoDelete: boolean = false;

    // protected runnigFlag: boolean = false;

    //间隔时间
    protected duration: number = 1;

    // //递增还是递减
    private updateType: TimeUpdateType = TimeUpdateType.UPDATE;

    constructor(func: Function, duration: number = 1) {
        this.func = func;
        this.time = 0;
        this.duration = duration;
        if (this.duration == -1) {
            this.updateType = TimeUpdateType.FRAME;
        }
        // this.setAutoDelete(autoDelete)
        // this.manager = manager;
    }

    setUpdateType(t: TimeUpdateType) {
        this.updateType = t;
    }

    setDuration(d: number) {
        this.duration = d;
    }

    getDuration() {
        return this.duration;
    }

    /**
     * 当前时间一定要小于endTime才有意义。
     * @param endTime 活动结束时间 单位秒
     */
    setEndTime(endTime: number, isTime: boolean) {
        if (isTime) {
            this.time = Math.floor(TimeHelper.leftTime(endTime) / 1000);
        } else {
            this.time = endTime
        }

        if (this.time < 0) {
            this.time = 0;
        }
        this.updateType = TimeUpdateType.SUB
    }
    /**
     * 一定要小于当前时间才有意义。
     * @param startTime 经过的时间
     */
    setStartTime(startTime: number) {
        this.time = Math.floor(TimeHelper.startTime(startTime) / 1000);
        this.updateType = TimeUpdateType.ADD;
    }


    update(dt: number) {
        // cc.log("update  dt ",dt," this.isAdd ",this.isAdd);
        switch (this.updateType) {
            case TimeUpdateType.ADD:
                this.time += dt
                if (this.func) {
                    this.func(this.time);
                }
                return false
            case TimeUpdateType.SUB:
                if (this.time > 0) {
                    this.time -= dt
                    if (this.time < 0) {
                        this.time = 0;
                    }
                    if (this.func) {
                        this.func(this.time);
                    }
                    return false
                } else {
                    return true;
                }
            case TimeUpdateType.FRAME:
                this.func(dt);
                break;
            default:
                this.time += dt;
                if (this.time >= this.duration) {
                    this.time = 0;
                    if (this.func) {
                        this.func(this.duration);
                    }
                    return true;
                } else {
                    return false;
                }
        }
    }


    // setAutoDelete(flag: boolean) {
    //     this.autoDelete = flag;
    // }

    // isAutoDelete() {
    //     return this.autoDelete;
    // }

    getTime() {
        return this.time;
    }



}
